#pragma once

#include <string>
#include <map>
#include <vector>
#include "../GrpcModule/GrpcModule.grpc.pb.h"
#include "../Base/CriticalSection.h"

class SyncDataCache
{
public:
    struct Data
    {
        int start_ = 0;
        int end_ = 0;
        bool is_successed_ = false;

        bool operator==(const Data& data)
        {
            return start_ == data.start_ && end_ == data.end_;
        }
    };

    typedef std::vector<Data> Datas;

    struct TableDatas
    {
        int end_;
        Datas datas_;
    };

    SyncDataCache();
    virtual ~SyncDataCache();

    void load();

    void setSuccessed(const std::string &table, const Data &data);

    void addData(const enclave::SyncTablesDatas &sync_tables_datas);

    const std::map<std::string, TableDatas> &tables_datas() { return tables_datas_; }

protected:
    void readFile(const char *file_name, TableDatas &table_datas);

    void saveFile(const char *table, TableDatas &table_datas);

private:
    std::map<std::string, TableDatas> tables_datas_;

	CriticalSection cs_;
};

